package PRO;

import java.math.BigInteger;

public class AtaqueFactFermat {

    BigInteger n, clavePublica;
    BigInteger[] textoCifrado;
    int descifrado;

    //Constructor de un nuevo ataque partiendo de un n, e y el texto cifrado
    public AtaqueFactFermat(BigInteger numero, BigInteger publica, BigInteger[] texto,int descifradoTipo) {
        
        n = numero;
        clavePublica = publica;
        textoCifrado = texto;
        descifrado=descifradoTipo;
    }
    
    //Este metodo obtiene un de los factores del numero n
    public BigInteger factorizacion(){
        Fermat fermat = new Fermat();
        return fermat.factor(n);
    }

    public void iniciar() {
        
        System.out.println("Realizando ataque de factorizacion de fermat...");
        
        long comienzo = System.nanoTime();
        long comienzo1 = System.currentTimeMillis();
        
        BigInteger factor1 = factorizacion();
        BigInteger factor2 = n.divide(factor1);
        System.out.println("Factores de [n] encontrados: " + factor1 + " x " + factor2+"\n");
        
        Rsa nuevoRsa = new Rsa(factor1, factor2, clavePublica,descifrado);
        String mensajeRoto = nuevoRsa.descifrar(textoCifrado);

        System.out.println("Valor Euler decifrado: " + nuevoRsa.vareulerF());
        System.out.println("Valor de la llave privada: " + nuevoRsa.vard());
        System.out.println("El mensaje interceptado fue: " + mensajeRoto);

        long fin = System.nanoTime();
        long fin1 = System.currentTimeMillis();
        long tiempo = (fin - comienzo);
        long tiempo1 = (fin1 - comienzo1);
        
        System.out.println("El proceso de ataque se ejecutó en " + tiempo + " nanosegundos");
        System.out.println("Redondeado en " + tiempo1 + " milisegundos");
    }
}